package com.xxdh.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.xxdh.domain.dto.TaskDto;
import com.xxdh.domain.po.Task;
import com.xxdh.domain.vo.TaskVo;
import com.xxdh.mapper.TaskMapper;
import com.xxdh.service.ITaskService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xxdh.util.UserHolder;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 任务详情表 服务实现类
 * </p>
 *
 * @author zwg
 * @since 2024-10-19
 */
@Service
public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements ITaskService {

    /**
     * 添加任务
     * @param taskDto
     */
    @Override
    public void addTask(TaskDto taskDto) {
        // 获取当前登录用户的id
        Long userId = UserHolder.getUserId();
        // 构建任务对象
        Task task = Task.builder().userId(userId).info(taskDto.getInfo())
                .endTime(taskDto.getEndTime()).priority(taskDto.getPriority()).build();
        // 保存任务
        save(task);
    }

    /**
     * 删除任务
     * @param id
     */
    @Override
    public void deleteTask(String id) {
        // 根据id删除任务
        removeById(id);
    }

    /**
     * 获取任务列表
     * @return
     */
    @Override
    public Map<String, List<TaskVo>> getTaskList() {
        // 获取当前登录用户的id
        Long userId = UserHolder.getUserId();
        // 查询当前用户的所有任务
        List<Task> taskList = lambdaQuery().eq(Task::getUserId, userId).list();
        // 按照结束时间排序
        List<Task> tasks = taskList.stream().sorted((t1, t2) -> t1.getEndTime().compareTo(t2.getEndTime())).collect(Collectors.toList());
        // 如果没有任务，则返回null
        if(CollUtil.isEmpty(tasks)){
            return new HashMap<>();
        }
        // 根据优先级分组(Collectors.groupingBy)
        Map<String, List<TaskVo>> result = tasks.stream().map(task ->
                TaskVo.builder().id(task.getId().toString()).userId(task.getUserId().toString())
                        .info(task.getInfo()).endTime(task.getEndTime()).isOver(task.getIsOver().toString())
                        .priority(task.getPriority().toString()).build()
        ).collect(Collectors.groupingBy(TaskVo::getPriority));
        return result;
    }

    /**
     * 更新任务优先级
     * @param id
     * @param priority
     */
    @Override
    public void updatePriority(String id, Integer priority) {
        // 根据id查询任务
        Task task = getById(Long.valueOf(id));
        // 更新优先级
        task.setPriority(priority);
        // 更新任务
        updateById(task);
    }
}
